package jm.nj.demo18main.demo02;

import jm.nj.demo03mian.demo03.B;
import jm.nj.demo18main.demo01.User;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.Test;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

/*
* 使用Apache  提供的BeanUtils
* 给成员变量注入(赋值)属性的值,获取属性值
*
* */
public class Demo01BeanUtils {

    @Test
    public void demo03  () throws Exception {
        /*
        * 使用populate方法,同时给多个成员变量,注入多个值
         * populate(Object bean, Map<String,String[]> properties)
         * populate(Object bean, Map<String,Sting[]>properties)
         * 将Map数据封装到指定Javabean中，一般用于将表单的所有数据封装到javabean
         * 相当于遍历Map集合,根据Map集合的key值(成员变量名称),调用setProperty给成员变量赋值
         *
         * Object bean 要赋值的JavaBean对象(User)
         * Map<String,String[]> property:Map集合
         *          key :成员变量名称
                     * value字符串格式数组
                     * 如果成员变量不是数组,就会把properties数组中的第一个值赋值成员变量
                     * 如果成员变量是数组,就会把properties数组中所有的值都赋值给成员变量的数组
             创建数组的三种方法
             * int[] arr = new int[10];
             * int[] arr = new int[] {1,2,3,4,5}
             * int[] arr = {1,2,3,4,5}定义的时候注意(定义数组变量和赋值必须写在一行,否则报错)
             *
         *
        * */

        //创建javaBean对象
        User user = new User();

        Map<String,String[]>properties = new HashMap<String, String[]>();
        //给Map赋值
        //如果成员变量不是数组,就会把properties数组中的第一个值赋值成员变量
        properties.put("id",new String[]{"1231","007"});
        properties.put("user",new String[]{"rose"});
        properties.put("password",new String[]{"1234"});
        properties.put("hobbies",new String[]{"早晨敲代码","中午敲代码","晚上敲代码","梦中敲代码"});

        BeanUtils.populate(user,properties);
        System.out.println(user);

    }


    @Test
    public void demo02() throws Exception {
        /*
        * 使用BeanUtils中的方法给成员变量注入(赋值)属性的值,获取属性值
        * static setProperty(Object name ,String name , Object value)   设置属性值
        * static String getProperty(Object obj,String name)  获得属性值
        *
        * 方法参数
        * object obj :要赋值/获取值的JavaBean对象(User)
        * String name:成员变量的名称(属性名)
         * 	Object value:给成员变量赋的实际使用的值
         *
         * 注意:
         * BeanUtils工具类可以给:基本数据类型,基本数据类型的包装类,String  ,以上3种类型的数组形式的成员变量赋值
         * BeanUtils中的setProperty方法可以把字符串类型的值,转换为基本数据类型的值
        * */
        User user = new User();
        //调用setProperty()给成员变量赋值,相当于调用了set方法
        BeanUtils.setProperty(user,"id","9527");
        BeanUtils.setProperty(user,"username","jack");
        BeanUtils.setProperty(user,"password","1234");
        System.out.println(user);

        //调用getProperty获取成员变量的值,相当于调用了get方法
        String id = BeanUtils.getProperty(user,"id");
        String username = BeanUtils.getProperty(user,"username");
        String pasword = BeanUtils.getProperty(user,"password");
        System.out.println(user);
    }


    @Test
    public void demo01(){
        User user = new User();
        //赋值,注入值
        user.setId(100);
        user.setUsername("jack");
        user.setPassword("123454");

        //获取值
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
    }
}
